package com.community.property.listener;

import com.community.property.domain.Repair;
import com.community.property.service.IRepairService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Date;

@Component
@Slf4j
public class RepairStatusListener {

    @Autowired
    private IRepairService repairService;

    /**
     * 监听死信队列
     */
    @RabbitListener(queues = "repair.dlx.queue")
    public void handleRepairStatusTimeout(Message message) {
        String messageBody = new String(message.getBody(), StandardCharsets.UTF_8);
        log.info("🔔 收到死信队列原始消息: {}", messageBody);

        try {
            // 使用更健壮的JSON解析方法
            Integer repairId = extractRepairId(messageBody);

            if (repairId == null) {
                log.warn("⚠️ 无法从消息中提取repairId，消息内容: {}", messageBody);
                return;
            }

            log.info("📊 开始检查报修状态，报修ID: {}", repairId);

            // 查询当前的报修信息
            Repair currentRepair = repairService.selectRepairByRepairId(repairId);
            if (currentRepair == null) {
                log.warn("⚠️ 报修记录不存在，报修ID: {}", repairId);
                return;
            }

            log.info("📋 当前报修状态 - 报修ID: {}, 当前状态: {}", repairId, currentRepair.getStatus());

            // 如果状态仍然是1（待分配），则自动更新为2（处理中）
            if (currentRepair.getStatus() != null && currentRepair.getStatus() == 1) {
                log.info("🔄 开始自动更新状态从 1 到 2...");

                // 更新状态为2（处理中）
                Repair updateRepair = new Repair();
                updateRepair.setRepairId(repairId);
                updateRepair.setStatus(2);
                updateRepair.setUpdateTime(new Date());

                int updateResult = repairService.updateRepair(updateRepair);

                if (updateResult > 0) {
                    log.info("✅ 报修状态自动更新成功，报修ID: {}, 状态从 1(待分配) 更新为 2(处理中)", repairId);
                } else {
                    log.error("❌ 报修状态自动更新失败，报修ID: {}", repairId);
                }
            } else {
                log.info("ℹ️ 报修状态已变更，无需自动更新，报修ID: {}, 当前状态: {}",
                        repairId, currentRepair.getStatus());
            }

        } catch (Exception e) {
            log.error("💥 处理报修状态超时消息失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 修复JSON解析方法
     */
    private Integer extractRepairId(String json) {
        try {
            // 使用更精确的匹配方式
            String searchStr = "\"repairId\":";
            int index = json.indexOf(searchStr);
            if (index == -1) {
                log.warn("未找到repairId字段");
                return null;
            }

            int valueStart = index + searchStr.length();

            // 找到值的结束位置
            int valueEnd = -1;
            for (int i = valueStart; i < json.length(); i++) {
                char c = json.charAt(i);
                if (c == ',' || c == '}') {
                    valueEnd = i;
                    break;
                }
            }

            if (valueEnd == -1) {
                valueEnd = json.length();
            }

            String valueStr = json.substring(valueStart, valueEnd).trim();
            log.debug("提取的repairId字符串: '{}'", valueStr);

            // 直接解析整数
            return Integer.parseInt(valueStr);

        } catch (Exception e) {
            log.warn("提取repairId失败: {}, JSON: {}", e.getMessage(), json);
            return null;
        }
    }
}